package com.atguigu.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Date;

/**
 * controller层中，方法的返回值
 */
@RequestMapping("returnType")
@Controller
public class ReturnTypeController {
    /**
     * 方法的返回值是String类型
     * 利用字符串，实现页面的转发和重定向
     */
    @RequestMapping("returnStringRedirectForward")
    public String returnStringRedirectForward(Model model){
        //可以将键值对，存储request域对象
        model.addAttribute("date",new Date());
        //返回字符串实现转发，写全路径，最好的转发 return "index";
        //return "forward:/WEB-INF/jsp/index.jsp";

        //实现重定向
        return "redirect:http://www.baidu.com";
    }

    /**方法不好 使用上面的方法
     * 方法无返回值，可以实现转发
     * 实现重定向：Servlet的API
     * 方式不太好：没有体系出SpringMVC框架的高度封装特性，使用原始的ServletAPI
     */
    @RequestMapping("noReturnType")
    public void noReturnType(Model model, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("访问的没有返回值的方法");
        //request.setAttribute("date",new Date());
        //实现转发
        //request.getRequestDispatcher("/WEB-INF/jsp/index.jsp").forward(request,response);

        //实现重定向
        response.sendRedirect("http://www.baidu.com");
    }

    /**
     * 返回值的字符串类型String
     * 返回字符串（直接返回逻辑视图名，数据使用Model和ModelMap封装）
     * 返回的就是页面的文件名即可,使用的是转发行为
     * return后面直接写页面的文件名，不需要前缀和后缀
     *
     * Model 接口：数据模型，可以将键值对，存储request域对象，没有视图
     * ModelAndView类：数据模型+视图的混合对象
     * 直接返回了字符串的视图名，可以不需要视图对象
     *
     * 注意:以后在写方法的时候，返回字符串的视图名，Model接口存储数据
     * 方法返回String类型，MVC框架自动的寻找对应的视图文件名
     */
    @RequestMapping("returnString")
    public String returnString(Model model){
        System.out.println("model = " + model.getClass());
        //可以将键值对，存储request域对象
        model.addAttribute("date",new Date());
        return "index";
    }
}
